//转换为bool
export function toStrictBoolean(value) {
	if (typeof value === "boolean") return value;
	if (typeof value === "string") {
		return value.toLowerCase() === "true";
	}
	return Boolean(value);
}

//格式化时间戳
export function formatTimestamp(timestamp) {
	const date = new Date(timestamp);

	const year = date.getFullYear();
	const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始，所以要+1
	const day = String(date.getDate()).padStart(2, '0');
	const hours = String(date.getHours()).padStart(2, '0');
	const minutes = String(date.getMinutes()).padStart(2, '0');
	const seconds = String(date.getSeconds()).padStart(2, '0');

	return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}


export function formatFixString(str, fix = '#') {
	if (typeof str !== 'string') {
		str = String(str);
	}
	str = str.replace(/#+/g, fix);
	if (!str.startsWith(fix)) {
		str = fix + str;
	}
	str = str.replace(/#+$/, '');
	return str === fix ? '' : str;
}

//判断是否在目标时间前30分钟内
export function isIn30Mins(targetTimeStr) {
	// 将目标时间字符串转换为Date对象
	const targetTime = new Date(targetTimeStr);

	// 获取当前时间
	const currentTime = new Date();

	if (targetTime > currentTime) {
		// 计算时间差（毫秒）
		const timeDiff = targetTime - currentTime;

		// 将毫秒转换为分钟
		const minutesDiff = timeDiff / (1000 * 60);

		// 判断是否在30分钟内
		return minutesDiff < 30;
	} else {
		return false;
	}
}

// 关闭当前页面，返回指定页面
export function backToTargetPage(targetPagePath) {
	const pages = getCurrentPages();
	let delta = 1;
	// 查找目标页面在页面栈中的位置
	for (let i = pages.length - 2; i >= 0; i--) {
		if (pages[i].route === targetPagePath) {
			delta = pages.length - 1 - i;
			break;
		}
	}
	uni.navigateBack({
		delta: delta
	});
}

/**
 * 将对象转换为URL参数字符串并拼接到URL上
 * @param {string} url - 基础URL地址
 * @param {Object} obj - 要转换为URL参数的对象
 * @returns {string} 拼接后的完整URL
 */
export function objectToUrlParams(url, obj) {
	if (!obj || Object.keys(obj).length === 0) {
		return url;
	}

	// 处理参数对象，过滤掉undefined和null的值
	const params = Object.entries(obj)
		.filter(([_, value]) => value !== undefined && value !== null)
		.map(([key, value]) => {
			// 如果值是对象或数组，则进行JSON序列化
			if (typeof value === 'object') {
				return `${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(value))}`;
			}
			return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
		})
		.join('&');

	// 判断原始URL是否已有参数
	const separator = url.includes('?') ? '&' : '?';

	return url + (params ? separator + params : '');
}

/**
 * 显示一条消息并后退
 */
export function showMessageBack(message = '操作成功', delay = 3000) {
	// 显示消息
	uni.showToast({
		title: message,
		icon: 'none',
		duration: delay
	})

	// delay 毫秒后返回上一页
	setTimeout(() => {
		uni.navigateBack()
	}, delay)
}


/**
 * 判断值是否为空
 * @param {*} val 任意类型的值
 * @returns {boolean} true 表示空
 */
export function isEmpty(val) {
	// null 或 undefined
	if (val === null || val === undefined) return true

	// 去掉前后空格的空字符串
	if (typeof val === 'string' && val.trim() === '') return true

	// 空数组
	if (Array.isArray(val) && val.length === 0) return true

	// 空对象（排除数组和 null）
	if (typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0) return true

	return false
}

/**
 * 检查对象是否有空值
 * @param {*} val 任意类型的值
 * @returns {boolean|string} 
 */
export function checkEmptyProperties(obj) {
	for (const [key, value] of Object.entries(obj)) {
		if (isEmpty(value)) {
			return key
		}

	}
	return false;
}


export function setEmptyProperties(obj,val) {
	for (const [key, value] of Object.entries(obj)) {
		if (isEmpty(value)) {
			obj[key]=val
		}
    }
	return obj;
}



export function handleMidButtonTap() {
	console.log('中间按钮跳转')
	uni.reLaunch({
		url: '/pages/msg/index'
	})
}


/**
 * 跳转页面
 * @param {string} url - 页面路径（不要带 ?）
 * @param {Object} params - 携带的参数
 * @param {string} type - 跳转类型 navigateTo | redirectTo | reLaunch | switchTab
 */
export function navigate(url, params = {}, type = 'navigateTo') {
	// 拼接参数
	let query = ''
	const keys = Object.keys(params)
	if (keys.length > 0) {
		query =
			'?' +
			keys
			.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
			.join('&')
	}

	const fullUrl = `${url}${query}`

	if (type === 'switchTab') {
		// switchTab 不支持 query
		uni.reLaunch({
			url
		})
	} else if (type === 'redirectTo') {
		uni.redirectTo({
			url: fullUrl
		})
	} else if (type === 'reLaunch') {
		uni.reLaunch({
			url: fullUrl
		})
	} else {
		uni.navigateTo({
			url: fullUrl
		})
	}
}
// 当前时间到0点的20分钟间隔时间段和带日期的时间段
export function generateRangesUntilMidnight(includeDate = false, count = 0) {
	let now = new Date();
	if (count > 0) {
		let countDate = new Date().getTime() + count
		if (count === 86400000) {
			now = new Date(formatTimestamp(countDate).split(' ')[0] + ' 00:00:00')
		} else {
			now = new Date(formatTimestamp(countDate))
		}
	}
	const ranges = [];
	const interval = 20 * 60 * 1000; // 20分钟（毫秒）

	// 计算当天24:00（即次日0:00）的时间戳
	const midnight = new Date(now);
	midnight.setHours(24, 0, 0, 0);

	// 格式化时间的工具函数
	const formatTime = (date) => {
		const year = date.getFullYear();
		const month = String(date.getMonth() + 1).padStart(2, '0');
		const day = String(date.getDate()).padStart(2, '0');
		const hours = String(date.getHours()).padStart(2, '0');
		const minutes = String(date.getMinutes()).padStart(2, '0');

		// 处理24:00的特殊显示
		const displayHours = hours === '00' && date.getDate() > now.getDate() ? '24' : hours;

		return includeDate ?
			`${year}~${month}~${day} ${displayHours}:${minutes}` :
			`${displayHours ==24 ? '24' : displayHours}:${minutes}`;
	};

	// 从当前时间向上取整到最近的20分钟间隔
	let current = new Date(now);
	const minutes = current.getMinutes();
	const remainder = minutes % 20;
	if (remainder !== 0) {
		current.setMinutes(minutes + (20 - remainder), 0, 0);
	}

	// 生成时间段直到午夜
	while (current < midnight) {
		const next = new Date(current.getTime() + interval);
		// 确保最后一个时间段不超过午夜
		const endTime = next > midnight ? midnight : next;
		ranges.push(`${formatTime(current)}~${formatTime(endTime)}`);
		current = next;
	}

	return ranges;
}
// 通过传入格式字符串（如 'MM/DD/YYYY'），实现更灵活的格式化：
export function formatDateCustom(date = new Date(), format = 'YYYY-MM-DD') {
	const d = new Date(date);
	const map = {
		'YYYY': d.getFullYear(),
		'MM': String(d.getMonth() + 1).padStart(2, '0'),
		'DD': String(d.getDate()).padStart(2, '0'),
		'HH': String(d.getHours()).padStart(2, '0'),
		'mm': String(d.getMinutes()).padStart(2, '0'),
		'ss': String(d.getSeconds()).padStart(2, '0')
	};
	// 替换格式字符串中的占位符
	return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => map[match]);
}

/**
 * 富文本图片替换
 * @param {Object} htmlContent
 */
export function richReplace(htmlContent) {
	return htmlContent?.replace(/<img/gi, '<img style="max-width:100%;height:auto;display:block"');
}


/**
 * 安全替换成https
 * @param {Object} urlString
 */
export function upgradeToHttps(urlString) {
	try {
		const url = new URL(urlString);
		if (url.protocol === "http:") {
			url.protocol = "https:";
			return url.toString();
		}
		return urlString;
	} catch {
		return urlString; // 如果不是有效 URL，返回原字符串
	}
};

/**
 * 提取对象数组中的某一列的值
 * @param {Object} arr
 * @param {Object} key
 */
export function appendKeyValuesToArray(arr, key) {
  return arr.map(item => item[key]).filter(value => value !== undefined);
}

/**
 * 获取指定格式的日期/时间字符串
 * @param {string} format - 'ym' | 'ymd' | 'ymdhms'
 * @param {Date} dateObj - 可选，传入 Date 对象，不传默认当前时间
 * @param {string} dateSep - 日期分隔符（默认 '-'）
 * @param {string} timeSep - 时间分隔符（默认 ':'）
 * @returns {string}
 */
export function getDateStr(format = 'ym', dateObj = new Date(), dateSep = '-', timeSep = ':') {
  const year = dateObj.getFullYear();
  const month = String(dateObj.getMonth() + 1).padStart(2, '0');
  const day = String(dateObj.getDate()).padStart(2, '0');
  const hour = String(dateObj.getHours()).padStart(2, '0');
  const minute = String(dateObj.getMinutes()).padStart(2, '0');
  const second = String(dateObj.getSeconds()).padStart(2, '0');

  if (format === 'ym') {
    return `${year}${dateSep}${month}`;
  } else if (format === 'ymd') {
    return `${year}${dateSep}${month}${dateSep}${day}`;
  } else if (format === 'ymdhms') {
    return `${year}${dateSep}${month}${dateSep}${day} ${hour}${timeSep}${minute}${timeSep}${second}`;
  } else {
    throw new Error("format 参数只能是 'ym' | 'ymd' | 'ymdhms'");
  }
}

//外部跳转
export function openUrl(url) {
  // #ifdef APP-PLUS
  plus.runtime.openURL(url, (err) => {
    console.error('openURL error:', err)
  })
  // #endif

  // #ifdef H5
  window.location.href = url
  // #endif

  // #ifdef MP-WEIXIN
  uni.navigateTo({
    url: '/pages/webview/index?url=' + encodeURIComponent(url)
  })
  // #endif
}